home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 25 / Cream of the Crop 25.iso / os2 / kzr0597.zip / ROOT3.CMD < prev    next >
OS/2 REXX Batch file  |  1997-02-06  |  3KB  |  83 lines

  1. /*  Programm  root3.CMD                                                  */
  2. /*  zur rekursiven Berechnung der dritten Wurzel von reellen Zahlen.     */
  3.  
  4.    Call RxFuncAdd 'SysLoadFuncs', RexxUtil, 'SysLoadFuncs'
  5.    Call SysLoadFuncs
  6.    signal on syntax name root3Msg
  7.  
  8. /* Diese Variablen müssen für jede Prozedur definiert werden, damit die  */
  9. /* Prozedur die Variable bufND kennt und die Variable ND übernehmen kann.*/
  10.    Pfd=SysSearchPath("PATH", "kzr.cmd")
  11.    lp=LastPos("\", Pfd)
  12.    Pfd=DelStr(Pfd, 1+lp)
  13.  
  14.    bufND =Pfd||"NDZahl.DAT"
  15.    bufMsg=Pfd||"Meldung.DAT"
  16.    ND = LineIn(bufND, 1)
  17.  
  18.    arg x,y
  19.    p0p=x*x /* Diese Anweisung prvoziert eine Syntax-Fehlermeldung */
  20.  
  21.    if length(y) > 0 then
  22.    do
  23.      ret=LineOut(bufMsg, "Im Argument von  root3(...)  ist mindestens  1  nicht zulässiges Komma !")
  24.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  25.   /*  damit in den diesbezüglichen temporären Dateien                      */
  26.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  27.      EXIT
  28.    end
  29.  
  30.    if x < 1.0E-10000 | x > 1.0E+10000 then
  31.    do
  32.      ret=LineOut(bufMsg, "     Das Argument der Funktion root3(...)",
  33.                          "                                          ",
  34.                          "sollte entweder gleich  0                                                      ",
  35.                          "oder größer als  1.0E-10000  und kleiner als  1.0E+10000  sein.")
  36.      /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  37.      /*  damit in den diesbezüglichen temporären Dateien                      */
  38.      /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  39.      EXIT
  40.    end
  41.  
  42.    NUMERIC DIGITS (ND+12)
  43.    vzx=1;
  44.    if (x=0) then do; y=0; return(y); EXIT; end;
  45.    if (x<0) then
  46.    do
  47.      vzx=-1; x=abs(x);
  48.    end
  49.  
  50.    if 0<x then if x<1 then SIGNAL A
  51.  
  52.    n=0; do while x>100
  53.           x=x/1000
  54.           n=n+1
  55.         end; SIGNAL B
  56.  
  57. A: n=0; do while x<0.01
  58.           x=x*1000
  59.           n=n-1
  60.         end
  61.  
  62. B: y=1; t=x/(y*y)
  63.         do while abs(y-t) > y*10**(-ND-5)
  64.           y=(2*y+t)/3
  65.           t=x/(y*y)
  66.         end
  67.  
  68.    u=vzx*y*10**n
  69.    numeric digits ND
  70.    return(Format(u))
  71.  
  72. root3Msg:
  73.    sf=ErrorText(RC)
  74.    if  Pos("Bad arithmetic conversion", sf) > 0 then
  75.    do
  76.      ret=LineOut(bufMsg, "Sie haben in  root3(...)  kein gültiges Argument eingegeben !")
  77.    /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  78.    /*  damit in den diesbezüglichen temporären Dateien                      */
  79.    /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  80.      EXIT
  81.    end
  82.  
  83.